www.gusucode.com > VC 2D游戏编辑器-源码程序 > VC 2D游戏编辑器-源码程序/code/game_Source/loadgame.cpp

    //Download by http://www.NewXing.com
#include <ddraw.h>
#include "main.h"
#include "LoadGame.h"
#include "newgame.h"
#include "savegame.h"

void CALLBACK LoadGameTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime);
void LoadGameRefreshScreen();
extern void JudgeMousePlace_save( );
extern void DrawGameInfo(int i);
extern void ShowGameInfo(int i);

extern RLEBITHEADER * SaveGameRLE;
extern RLEBITHEADER * selete_SaveRLE;
extern RLEBITHEADER * unselete_SaveRLE;
extern RLEBITHEADER * scrollRLE;

extern BMPHEADER	* gameImage[4];
extern GameSave		* gameOldSaved[4];

extern int iScroll;
extern int id_game;
extern int iCurrentStartN;	//当前开始的存档号


bool LoadGameSelect = false;
int LoadGameSelectNum = 0;

int LoadGame( )
{
	MSG msg;
	LoadGameSelect = false;
	SaveGameRLE = LoadRleImage("pic\\dialog\\dialog.ret");
	selete_SaveRLE = LoadRleImage("pic\\dialog\\select_Save.ret");
	unselete_SaveRLE = LoadRleImage("pic\\dialog\\unselect_Save.ret");
	scrollRLE = LoadRleImage("pic\\dialog\\scroll.ret");
	
	int i;

	iScroll = 0;
	iCurrentStartN = 0;

	for(i = 0; i < 4; i++)
	{
		gameOldSaved[i] = NULL;
		DrawGameInfo(i);
	}

	long lW, lH;
	//显示对话框
	lW = (SCREEN_WIDTH-SaveGameRLE->bfWidth)>>1;
	lH = (SCREEN_HEIGHT-SaveGameRLE->bfHeight)>>1;
	ShowRleImage_NR(lW, lH, 0, 0, SaveGameRLE, pS[SBuffer], SP[SBuffer]);	
	//显示档案记录
	ShowRleImage_NR(lW+26, lH+26, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
	ShowRleImage_NR(lW+26, lH+139, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
	ShowRleImage_NR(lW+26, lH+252, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
	ShowRleImage_NR(lW+26, lH+365, 0, 0, unselete_SaveRLE, pS[SBuffer], SP[SBuffer]);
	//存储当前图形
	rect1 = MakeRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
	FastBlt(0, 0, rect1, pS[SBack], pS[SBuffer], SP[SBack], SP[SBuffer], false, 0);

	cursor = 0;
	PA_SAFE_DELETE(mouseRLE);
	mouseRLE = LoadRleImage("Pic\\cursor\\cursor01.ret");
	cursorT = 4;
	SetTimer(hwnd, 1, 50, LoadGameTimer);
	while(!LoadGameSelect)
	{
		if(PeekMessage(&msg,NULL,0,0,PM_REMOVE))
		{
			if ( msg.message==WM_QUIT)
				break;
			TranslateMessage(&msg);
			DispatchMessage(&msg);
		}
		else 
		{	
			LoadGameRefreshScreen( );
		}			
	}
	KillTimer(hwnd, 1);
	if(LoadGameSelectNum != 0xffff)
	{
		int iN = i+iScroll;
		char	filename[10];
		char	pstrFileName[MAX_PATH];
		if(role == NULL)
			role = new ROLE( );
		role->LoadFromRole(gameOldSaved[id_game-1]->GameRole);

		GetCurrentDirectory(MAX_PATH,pstrFileName);
		strcat(pstrFileName,  "\\save\\");
		itoa(id_game-1, filename, 10);
		strcat(pstrFileName, filename);
		strcat(pstrFileName, ".save");	

		FILE *file=fopen(pstrFileName,"rb");

		if(file)
		{
			if(MainScript.Script != NULL)
				PA_SAFE_DELETE(MainScript.Script);

			fread(&MainScript, sizeof(CScript), 1, file);
			for(i = 0; i < 10; i++)
			{
				if(Script_Child[i].Script != NULL)
				{
					PA_SAFE_DELETE(Script_Child[i].Script);
				}
				fread(&Script_Child[i], sizeof(CScript), 1, file);
				Script_Child[i].Script = NULL;
			}
			char MapName[10][MAX_PATH];
			fread(MapName[0], MAX_PATH*sizeof(char), 1, file) ;
			for(i = 0; i < 9; i++)
			{
				fread(MapName[i+1], MAX_PATH*sizeof(char), 1, file) ;
			}

			Zoetic = new CZoetic;
		
			fread(&Zoetic->ZoeticHeader, sizeof(_ZoeticHeader), 1, file);

			Zoetic->ZoeticLink		= new	_ZoeticLink[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->dx				= new			int[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->dy				= new			int[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->MainStatus		= new			int[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->FootStatus		= new			int[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->face			= new			int[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->Waittime		= new			int[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->MagicUsing		= new  MagicIsUsing[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->findpath		= new	FINDPATH_A4[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->ZoeticTime		= new		  DWORD[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->under_fireT		= new		  DWORD[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->strengthSearch	= new		   WORD[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->newx_Zoetic		= new		  float[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->newy_Zoetic		= new		  float[Zoetic->ZoeticHeader.nMagicN];
			Zoetic->WalkNumber		= new			int[Zoetic->ZoeticHeader.nMagicN];
			memset(Zoetic->Waittime, -1, Zoetic->ZoeticHeader.nMagicN*sizeof(int));
			memset(Zoetic->strengthSearch, 0, Zoetic->ZoeticHeader.nMagicN*sizeof(WORD));
			memset(Zoetic->newx_Zoetic, 0, Zoetic->ZoeticHeader.nMagicN*sizeof(float));
			memset(Zoetic->newy_Zoetic, 0, Zoetic->ZoeticHeader.nMagicN*sizeof(float));
			memset(Zoetic->WalkNumber, -1, Zoetic->ZoeticHeader.nMagicN*sizeof(int));
			memset(Zoetic->ZoeticTime, 0, Zoetic->ZoeticHeader.nMagicN*sizeof(DWORD));
			memset(Zoetic->under_fireT, 0, Zoetic->ZoeticHeader.nMagicN*sizeof(DWORD));
			int * iLink				= new			int[Zoetic->ZoeticHeader.nMagicN];
			fread(Zoetic->MainStatus, Zoetic->ZoeticHeader.nMagicN*sizeof(int), 1, file);
			fread(iLink, Zoetic->ZoeticHeader.nMagicN*sizeof(int), 1, file);
			fread((char *)Zoetic->ZoeticLink,Zoetic->ZoeticHeader.nMagicN*sizeof(_ZoeticLink), 1, file);

			fclose(file);
			if(MainScript.Script != NULL)
				MainScript.LoadScript();
			for(i = 0; i < 10; i++)
			{
			 	Script_Child[i].LoadScript();
			}

			for(i = 0; i < 9; i++)
			{
				strcpy(pstrFileName, "map\\");
				strcat(pstrFileName, MapName[i+1]);
				Map_Child[i].LoadMap(i, MapName[i+1], pstrFileName);
				if(!strcmp(MapName[0], MapName[i+1]))
					Map = &Map_Child[i];
			}

			_ZoeticLink *  ZoeticLink;
			for(i = 0; i < (int)Zoetic->ZoeticHeader.nMagicN; i++)
			{
				Zoetic->dx[i] = Zoetic->ZoeticLink[i].dCurrent_x;
				Zoetic->dy[i] = Zoetic->ZoeticLink[i].dCurrent_y;
				Zoetic->Waittime[i]			= -1;
				Zoetic->FootStatus[i] = -1;
				Zoetic->face[i] = 0;
				memset(Zoetic->findpath[i].pathX, -1, TABLE_X*TABLE_Y*sizeof(int));
				memset(Zoetic->findpath[i].pathY, -1, TABLE_X*TABLE_Y*sizeof(int));
			}
			for(i = 0; i < (int)Zoetic->ZoeticHeader.nMagicN; i++)
			{
				if(iLink[i] == 0xffff)
				{
					if(i == 0)
					{
						Zoetic->ZoeticLinkHeader = NULL;
					}
					else
					{
						ZoeticLink->Next = NULL;
					}
					break;
				}
				else
				{
					if(i == 0)
					{
						Zoetic->ZoeticLinkHeader = &Zoetic->ZoeticLink[iLink[i]];
						ZoeticLink = Zoetic->ZoeticLinkHeader;
						ZoeticLink->Back = NULL;
					}
					else
					{
						ZoeticLink->Next = &Zoetic->ZoeticLink[iLink[i]];
						Zoetic->ZoeticLink[iLink[i]].Back = ZoeticLink;
						ZoeticLink = ZoeticLink->Next;
					}
				}
			}
			if(i != 0)
				Zoetic->ZoeticLink[iLink[i-1]].Next = NULL;
			P_SAFE_DELETE(iLink);
		}

		PA_SAFE_DELETE(SaveGameRLE);
		PA_SAFE_DELETE(selete_SaveRLE);
		PA_SAFE_DELETE(unselete_SaveRLE);
		PA_SAFE_DELETE(scrollRLE);
		for(i = 0; i < 4; i++)
		{
			P_SAFE_DELETE(gameOldSaved[i]);
			PA_SAFE_DELETE(gameImage[i]);
		}
		gWPPStack.Push(lpWndProc);
		lpWndProc=NewGameMessageProc;
		LoadGameSelectNum = StartGame( );
		gWPPStack.Pop(lpWndProc);
	}
	else
	{
		PA_SAFE_DELETE(SaveGameRLE);
		PA_SAFE_DELETE(selete_SaveRLE);
		PA_SAFE_DELETE(unselete_SaveRLE);
		PA_SAFE_DELETE(scrollRLE);
		for(i = 0; i < 4; i++)
		{
			PA_SAFE_DELETE(gameOldSaved[i]);
			PA_SAFE_DELETE(gameImage[i]);
		}
	}

	return LoadGameSelectNum;
}

LRESULT WINAPI LoadGameMessageProc(HWND hwnd, UINT message,WPARAM wParam, LPARAM lParam)
{
	switch(message)
	{
	case WM_SETCURSOR:
		SetCursor(NULL);
		break;
	case WM_KEYDOWN:
		switch(wParam)
		{
		case VK_ESCAPE:
			LoadGameSelectNum = 0xffff;
			LoadGameSelect = true;
			break;
		default:
			return 1;
		}
		break;
	case WM_LBUTTONDOWN:
		curpos.x = LOWORD (lParam);
		curpos.y = HIWORD (lParam);
		JudgeMousePlace_save( );
		switch(id_game)
		{
		case 0x01:
		case 0x02:
		case 0x03:
		case 0x04:
			LoadGameSelectNum = id_game+iScroll;
			LoadGameSelect = true;
			break;
		case 0x101:
			if(iScroll >0)
			{
				iScroll --;
			}
			break;
		case 0x102:
			if(iScroll < 16)
			{
				iScroll ++;
			}
			break;
		}
		break;
	case WM_MOUSEMOVE:
		curpos.x = LOWORD (lParam);
		curpos.y = HIWORD (lParam);
		if(curpos.x > SCREEN_WIDTH - 1 )
		{
			curpos.x = SCREEN_WIDTH-1;
			SetCursorPos(curpos.x, curpos.y);
		}
		if(curpos.y > SCREEN_HEIGHT - 1)
		{
			curpos.y = SCREEN_HEIGHT-1;
			SetCursorPos(curpos.x, curpos.y);
		}
		JudgeMousePlace_save( );
		break;
    default:
		return DefWindowProc(hwnd, message, wParam, lParam);
	}
	return 1;
}

void LoadGameRefreshScreen()
{
	long lW, lH;
	lW = (SCREEN_WIDTH-SaveGameRLE->bfWidth)>>1;
	lH = (SCREEN_HEIGHT-SaveGameRLE->bfHeight)>>1;

	rect1 = MakeRect(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT);
	FastBlt(0, 0, rect1, pS[SBuffer], pS[SBack], SP[SBuffer], SP[SBack], false, 0);
	
	switch(id_game)
	{
	case 0x01:	//当鼠标当前第一个存档时
		ShowRleImage_NR(lW+26, lH+26, 0, 0, selete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		break;
	case 0x02:  //当鼠标当前第二个存档时
		ShowRleImage_NR(lW+26, lH+139, 0, 0, selete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		break;
	case 0x03:  //当鼠标当前第三个存档时
		ShowRleImage_NR(lW+26, lH+252, 0, 0, selete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		break;
	case 0x04:  //当鼠标当前第四个存档时
		ShowRleImage_NR(lW+26, lH+365, 0, 0, selete_SaveRLE, pS[SBuffer], SP[SBuffer]);
		break;
	}
	//显示存档信息
	int i;
		if(iCurrentStartN != iScroll)
		{
			if(iCurrentStartN > iScroll)
			{
				switch(iCurrentStartN - iScroll)
				{
				case 1:
					P_SAFE_DELETE(gameOldSaved[3]);
					PA_SAFE_DELETE(gameImage[3]);
	
					gameOldSaved[3] = gameOldSaved[2];
					gameImage[3]	= gameImage[2];
					gameOldSaved[2] = gameOldSaved[1];
					gameImage[2]	= gameImage[1];
					gameOldSaved[1] = gameOldSaved[0];
					gameImage[1]	= gameImage[0];

					gameOldSaved[0] = NULL;
					gameImage[0]	= NULL;
	
					DrawGameInfo(0);
					break;
				case 2:
					P_SAFE_DELETE(gameOldSaved[3]);
					PA_SAFE_DELETE(gameImage[3]);
					P_SAFE_DELETE(gameOldSaved[2]);
					PA_SAFE_DELETE(gameImage[2]);
	
					gameOldSaved[3] = gameOldSaved[1];
					gameImage[3]	= gameImage[1];
					gameOldSaved[2] = gameOldSaved[0];
					gameImage[2]	= gameImage[0];
	
					gameOldSaved[1] = NULL;
					gameImage[1]	= NULL;
					gameOldSaved[0] = NULL;
					gameImage[0]	= NULL;
	
					DrawGameInfo(0);
					DrawGameInfo(1);
					break;
				case 3:
					P_SAFE_DELETE(gameOldSaved[3]);
					PA_SAFE_DELETE(gameImage[3]);
					P_SAFE_DELETE(gameOldSaved[2]);
					PA_SAFE_DELETE(gameImage[2]);
					P_SAFE_DELETE(gameOldSaved[1]);
					PA_SAFE_DELETE(gameImage[1]);
	
					gameOldSaved[3] = gameOldSaved[0];
					gameImage[3]	= gameImage[0];
	
					gameOldSaved[0] = NULL;
					gameImage[0]	= NULL;
					gameOldSaved[1] = NULL;
					gameImage[1]	= NULL;
					gameOldSaved[2] = NULL;
					gameImage[2]	= NULL;
	
					DrawGameInfo(0);
					DrawGameInfo(1);
					DrawGameInfo(2);
					break;
				default:
					for(i = 0; i < 4; i++)
					{
						DrawGameInfo(i);
					}
					break;
				}
			}
			else
			{
				switch(iScroll - iCurrentStartN)
				{
				case 1:
					P_SAFE_DELETE(gameOldSaved[0]);
					PA_SAFE_DELETE(gameImage[0]);
	
					gameOldSaved[0] = gameOldSaved[1];
					gameImage[0]	= gameImage[1];
					gameOldSaved[1] = gameOldSaved[2];
					gameImage[1]	= gameImage[2];
					gameOldSaved[2] = gameOldSaved[3];
					gameImage[2]	= gameImage[3];
	
					gameOldSaved[3] = NULL;
					gameImage[3]	= NULL;
	
					DrawGameInfo(3);
					break;
				case 2:
					P_SAFE_DELETE(gameOldSaved[0]);
					PA_SAFE_DELETE(gameImage[0]);
					P_SAFE_DELETE(gameOldSaved[1]);
					PA_SAFE_DELETE(gameImage[1]);
	
					gameOldSaved[0] = gameOldSaved[2];
					gameImage[0]	= gameImage[2];
					gameOldSaved[1] = gameOldSaved[3];
					gameImage[1]	= gameImage[3];
	
					gameOldSaved[2] = NULL;
					gameImage[2]	= NULL;
					gameOldSaved[3] = NULL;
					gameImage[3]	= NULL;
	
					DrawGameInfo(2);
					DrawGameInfo(3);
					break;
				case 3:
					P_SAFE_DELETE(gameOldSaved[0]);
					PA_SAFE_DELETE(gameImage[0]);
					P_SAFE_DELETE(gameOldSaved[1]);
					PA_SAFE_DELETE(gameImage[1]);
					P_SAFE_DELETE(gameOldSaved[2]);
					PA_SAFE_DELETE(gameImage[2]);
	
					gameOldSaved[0] = gameOldSaved[3];
					gameImage[0]	= gameImage[3];
	
					gameOldSaved[1] = NULL;
					gameImage[1]	= NULL;
					gameOldSaved[2] = NULL;
					gameImage[2]	= NULL;
					gameOldSaved[3] = NULL;
					gameImage[3]	= NULL;
	
					DrawGameInfo(1);
					DrawGameInfo(2);
					DrawGameInfo(3);
					break;
				default:
					for(i = 0; i < 4; i++)
					{
						DrawGameInfo(i);
					}
					break;
				}
			}
			iCurrentStartN = iScroll;
		}
	for(i = 0; i < 4; i++)
	{
		ShowGameInfo(i);
	}
	
	//显示滚动箭头
	if(iScroll != 0)
	{
		if(id_game != 0x101)
			ShowRleImage_NR(lW+555, lH+180, 0, 0, scrollRLE, pS[SBuffer], SP[SBuffer]);
		else
			ShowRleImage_NR(lW+555, lH+180, 1, 0, scrollRLE, pS[SBuffer], SP[SBuffer]);
	}
	if(iScroll != 16)
	{
		if(id_game != 0x102)
			ShowRleImage_NR(lW+555, lH+259, 0, 1, scrollRLE, pS[SBuffer], SP[SBuffer]);
		else
			ShowRleImage_NR(lW+555, lH+259, 1, 1, scrollRLE, pS[SBuffer], SP[SBuffer]);
	}

	//显示鼠标
	
	lW = mouseRLE->bfWidth/mouseRLE->bfWidthBitN;
	lH = mouseRLE->bfHeight/mouseRLE->bfHeightBitN;

	RECT rect3;
	rect3.left = 0;
	rect3.top  = 0;
	rect3.right = curpos.x+lW > SCREEN_WIDTH?SCREEN_WIDTH-curpos.x:lW;
	rect3.bottom = curpos.y+lH > SCREEN_HEIGHT?SCREEN_HEIGHT-curpos.y:lH;
	ShowRleImage(curpos.x, curpos.y, cursor, 0, rect3, mouseRLE, pS[SBuffer], SP[SBuffer]);
	UpdateScreen();
}

void CALLBACK LoadGameTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime)
{
}